package com.topfun.utils;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;


/**
 * Created by huangda on 2017-02-27.
 *
 */
@SuppressWarnings({"unused", "WeakerAccess", "SameParameterValue"})
public class GsonUtil {
    // ===========================================================
    // Constants
    // ===========================================================
    private static final Gson GSON_DEFAULT = new Gson();
    private static final Gson GSON_DEFAULT_WITH_EXPOSE = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

    // ===========================================================
    // Fields
    // ===========================================================


    // ===========================================================
    // Constructors
    // ===========================================================


    // ===========================================================
    // Getter &amp; Setter
    // ===========================================================


    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================


    // ===========================================================
    // Methods
    // ===========================================================
    public static <T> T fromJson(String pJson, Class<T> pClass){
        return fromJson(pJson, pClass, false);
    }

    public static <T> T fromJson(String pJson, Class<T> pClass, boolean pEnableExpose){
        if(pEnableExpose){
            return GSON_DEFAULT_WITH_EXPOSE.fromJson(pJson, pClass);
        }
        return GSON_DEFAULT.fromJson(pJson, pClass);
    }

    public static <T> T fromJson(String pJson, Type pType){

        return fromJson(pJson, pType, false);
    }

    public static <T> T fromJson(String pJson, Type pType, boolean pEnableExpose){
        if(pEnableExpose){
            return GSON_DEFAULT_WITH_EXPOSE.fromJson(pJson, pType);
        }
        return GSON_DEFAULT.fromJson(pJson, pType);
    }

    public static <T> List<T> listFromJson(String pJson, Class<T[]> pClazz){
        // Type listType = new TypeToken<ArrayList<T>>(){}.getType();
        return listFromJson(pJson, pClazz, false);
    }

    public static <T> List<T> listFromJson(String pJson, Class<T[]> pClazz, boolean pEnableExpose){
        // Type listType = new TypeToken<ArrayList<T>>(){}.getType();
        if(pEnableExpose){
            return Arrays.asList(GSON_DEFAULT_WITH_EXPOSE.fromJson(pJson, pClazz));
        }
        return Arrays.asList(GSON_DEFAULT.fromJson(pJson, pClazz));
    }

    public static String toJson(Object pObject){
        return toJson(pObject, false);
    }

    public static String toJson(Object pObject, boolean pEnableExpose){
        if(pObject != null){
            if(pEnableExpose){
                return GSON_DEFAULT_WITH_EXPOSE.toJson(pObject);
            }
            return GSON_DEFAULT.toJson(pObject);
        }
        return "{}";
    }

    public static JsonObject stringToJsonObject(String jsonStr){
        return new JsonParser().parse(jsonStr).getAsJsonObject();
    }
    public static JsonArray stringToJsonArray(String jsonStr){
        return new JsonParser().parse(jsonStr).getAsJsonArray();
    }

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}
